<?php

include_once($common_data_server."lib/php/_db_sql_mssql.php");

if ( file_exists($common_data_server . "lib/php/shop.php") )
    include_once( "shop.php" );

$DB = new Db ( $db_server, $db_name, $db_user, $db_password );

/* Функция возвращает строку $string с экранированными спецсимволами, то есть в виде безопасном для помещения в БД*/
function db_quote($string){
	return preg_replace("/'/", "''", $string);
}

/*
    Функция возвращает массив хешей, являющийся результатом SQL запроса.
*/
function sql_select($sql_string, // SELECT-запрос
                    $from="",    // 0-based индекс первой возвращаемой записи
                    $count=""){  // кол-во возвращаемых записей
    global $DB;
    $res_set=array();

    preg_match  ("/LIMIT (\d+),\s*(\d+)/i", $sql_string, $matches);
    $sql_string=preg_replace("/LIMIT \d+,\s*\d+/i", "", $sql_string);
    $from=$matches[1];
    $count=$matches[2];
    $s = $DB->Select($sql_string);

    $i=0;
   	while($row = $s->FetchArray()){
		if(!$count or ($i>=$from and $i<$from+$count)){
		    $res_set[]=$row;
		}
		if($from!="" && $count!="" && $i>=$from+$count)
		    break;
		$i++;
	}
    $res = array();
    foreach ($res_set as $v){
       array_walk($v, 'modify_field');
       array_push($res, $v);
    }
    return $res;
}

function modify_field(&$array){
   if ($array == " ")
       $array = trim($array);
}

/* Функция выполняет вставку записи в таблицу
  $table - имя таблицы
  $fields[]['name']  - имя поля в таблице
  $fields[]['value'] - значение, которое нужно вставить
  $fields[]['type']  - тип поля, значение 'BLOB' должно обрабатываться
                       особым образом
*/
function insert_record( $table, $fields, $debug=0 ){
    global $DB;
    $field_names="(";
    $field_values="(";

    while( $c_field=current($fields) ){
        $field_names.=", ".$c_field['name'];
        if(trim(strtoupper($c_field['type']))=="DATE"){
	        $field_values.=", '". to_db_date($c_field['value'])."'";
        }elseif(trim(strtoupper($c_field['type']))=="TIMESTAMP"){
            $field_values.=", '". to_db_timestamp($c_field['value'])."'";
        }else{
	        $c_field['value']=preg_replace("/'/", "''", $c_field['value']);
			$field_values.=", '".$c_field['value']."'";
		}
        next($fields);
    }

    $field_names.=')';
    $field_names=preg_replace("/\(, /", "(", $field_names);
    $field_values.=')';
    $field_values=preg_replace("/\(, /", "(", $field_values);
    $sql="INSERT INTO $table $field_names VALUES $field_values";
    if($debug){
        print $sql;
    }
    $DB->ExecSQL($sql);
    $DB->Commit();
}

/* Функция выполняет вставку записи в таблицу
  $table - имя таблицы
  $fields[]['name']  - имя поля в таблице
  $fields[]['value'] - значение, которое нужно вставить
  $fields[]['type']  - тип поля из деф-файла
*/
function insert_record_with_type( $table, $fields){
    global $DB;
    $field_names="(";
    $field_values="(";
    $blobs = Array();

    while( $c_field=current($fields) ){
        $field_names.=", ".$c_field['name'];

    	if(preg_match("/date/",$c_field['type']) && $c_field['value']==""){
            $field_values.=", NULL";
        }else{
	        $c_field['value']=preg_replace("/'/", "''", $c_field['value']);
    		$field_values.=", '".$c_field['value']."'";
    	}
        next($fields);
    }

    $field_names.=')';
    $field_names=preg_replace("/\(, /", "(", $field_names);
    $field_values.=')';
    $field_values=preg_replace("/\(, /", "(", $field_values);
    $sql="INSERT INTO $table $field_names VALUES $field_values";
    return $DB->ExecSQL($sql,true,$blobs);
}

/* Функция выполняет измененние одной записи в таблице
  $table - имя таблицы
  $fields[]['name']  - имя поля в таблице
  $fields[]['value'] - значение, которое нужно вставить
  $fields[]['type']  - тип поля, значение 'BLOB' должно обрабатываться
                       особым образом
  $pk_name           - Имя поля, явлющегося первичным ключом
  $pk_value          - значение первичного ключа, определяющее запись
*/
function update_record( $table, $fields, $pk_name, $pk_value, $debug=0 ){
    global $DB;

    $fields_set="";
    while( $c_field=current($fields) ){
        $fields_set.=", ".$c_field['name']."=";
    	if (trim(strtoupper($c_field['type']))=="DATE"){
           $fields_set.="'".to_db_date($c_field['value'])."'";
        } elseif (trim(strtoupper($c_field['type']))=="TIMESTAMP") {
           $fields_set.="'".to_db_timestamp($c_field['value'])."'";
        }else{
			$c_field['value']=preg_replace("/'/", "''", $c_field['value']);
			$fields_set.="'".$c_field['value']."'";
		}
        next($fields);
    }

    $fields_set=preg_replace("/^, /", "", $fields_set);
	$sql="UPDATE $table SET $fields_set WHERE $pk_name='".db_quote($pk_value)."'";
    if($debug){
        print $sql;
    }
    return $DB->ExecSQL($sql);
}

/* Функция выполняет измененние одной записи в таблице
  $table - имя таблицы
  $fields[]['name']  - имя поля в таблице
  $fields[]['value'] - значение, которое нужно вставить
  $fields[]['type']  - тип поля из деф-файла
  $pk_fields[]["name"]           - Имя поля, явлющегося первичным ключом
  $pk_fields[]["value"]          - значение первичного ключа, определяющее запись
*/
function update_record_with_type( $table, $fields, $pk_fields){
    global $DB;

    $fields_set="";
    $blobs = Array();
    while( $c_field=current($fields) ){
        $fields_set.=", ".$c_field['name']."=";
    	if (preg_match("/date/",$c_field['type']) && $c_field['value']==""){
           $fields_set.="NULL";
        }else{
			$c_field['value']=preg_replace("/'/", "''", $c_field['value']);
			$fields_set.="'".$c_field['value']."'";
		}
        next($fields);
    }

    $fields_set=preg_replace("/^, /", "", $fields_set);
	foreach($pk_fields as $pkf)
    	$pk_string.=" {$pkf["name"]}='".db_quote($pkf["value"])."' AND";
    $pk_string=substr($pk_string,0,strlen($pk_string)-4);
    $sql="UPDATE $table SET $fields_set WHERE $pk_string";
    return $DB->ExecSQL($sql,true,$blobs);
}

/* Функция выполняет удаление одной записи из таблицы
  $table - имя таблицы
  $pk_name           - Имя поля, явлющегося первичным ключом
  $pk_value          - значение первичного ключа, определяющее запись
*/
function delete_record( $table, $pk_name, $pk_value, $debug=0 ){
    global $DB;

    $sql="DELETE FROM $table WHERE $pk_name='".db_quote($pk_value)."'";
    if($debug){
        print $sql;
    }
    return $DB->ExecSQL($sql);
}

/* Функция выполняет удаление одной записи из таблицы
  $table - имя таблицы
  $pk_fields[]["name"]           - Имя поля, явлющегося первичным ключом
  $pk_fields[]["value"]          - значение первичного ключа, определяющее запись
*/
function delete_record2( $table, $pk_fields){
    global $DB;

    foreach($pk_fields as $pkf)
    	$pk_string.=" {$pkf["name"]}='".db_quote($pkf["value"])."' AND";
    $pk_string=substr($pk_string,0,strlen($pk_string)-4);
    $sql="DELETE FROM $table WHERE $pk_string";
    return $DB->ExecSQL($sql);
}

function sql_query($sql_string){
    global $DB;
    return $DB->ExecSQL($sql_string);
}

?>